#include<iostream>
#include<algorithm>
#include<math.h>
#include<queue>
#include<vector>
using namespace std;
const int maxn=22;
int N,inp[maxn];
vector<int> ans;
struct node{
    int data;
    int height;
    node* lchild=NULL;
    node* rchild=NULL;
};
node* newNode(int x){
    node* Node=new node;
    Node->data=x;
    Node->height=1;
    return Node;
}
int getHeight(node* root){
    if(root==NULL) return 0;
    return root->height;
}
int getBalance(node* root){
    return getHeight(root->lchild)-getHeight(root->rchild);
}
void updateHeight(node* root){
    root->height=max(getHeight(root->lchild),getHeight(root->rchild))+1;
}
void L(node* &root){
    node* tmp=root->rchild;
    root->rchild=tmp->lchild;
    tmp->lchild=root;
    updateHeight(root);
    updateHeight(tmp);
    root=tmp;
}
void R(node* &root){
    node* tmp=root->lchild;
    root->lchild=tmp->rchild;
    tmp->rchild=root;
    updateHeight(root);
    updateHeight(tmp);
    root=tmp;
}
void insert(node* &root,int x){
    if(root==NULL){root=newNode(x);return;}
    if(x<root->data){
        insert(root->lchild,x);
        updateHeight(root);
        if(getBalance(root)==2){
            if(getBalance(root->lchild)==1){
                R(root);
            }
            else if(getBalance(root->lchild)==-1){
                L(root->lchild);
                R(root);
            }
        }
    }
    else{
        insert(root->rchild,x);
        updateHeight(root);
        if(getBalance(root)==-2){
            if(getBalance(root->rchild)==-1){
                L(root);
            }
            else if(getBalance(root->rchild)==1){
                R(root->rchild);
                L(root);
            }
        }
    }
}

node* create(int data[],int x){
    node* root=NULL;
    for(int i=0;i<x;i++){
        insert(root,data[i]);
    }
    return root;
}

void layerorder(node* root){
    queue<node*>que;
    while(!que.empty())que.pop();
    que.push(root);
    node* tmp;
    bool flag=false;
    while(!que.empty()){
        tmp=que.front();que.pop();
        if(tmp==NULL){
            if(ans.size()<N){
                flag=true;
            }
            else if(ans.size()==N && flag==false){
                break;
            }
        }
        else{
            ans.push_back(tmp->data);
            que.push(tmp->lchild);
            que.push(tmp->rchild);
        }


    }
    for(int i=0;i<N;i++){
        if(i==0)printf("%d",ans[0]);
        else printf(" %d",ans[i]);
    }
    printf("\n");
    if(flag==false)printf("YES");
    else printf("NO");
}

int main(){
    //freopen("in.txt","r",stdin);
    scanf("%d",&N);
    for(int i=0;i<N;i++){
        scanf("%d",&inp[i]);
    }
    node* root=NULL;
    root=create(inp,N);
    layerorder(root);
}
